##
##    This file is part of Metrix.
##
##    Metrix is free software: you can redistribute it and/or modify
##    it under the terms of the GNU General Public License as published by
##    the Free Software Foundation, either version 3 of the License, or
##    (at your option) any later version.
##
##    Metrix is distributed in the hope that it will be useful,
##    but WITHOUT ANY WARRANTY; without even the implied warranty of
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##    GNU General Public License for more details.
##
##    You should have received a copy of the GNU General Public License
##    along with Metrix.  If not, see <http://www.gnu.org/licenses/>.
##

class MetricasController < ApplicationController

	def index
	end

	def id_producto
		if request.post?
			if params[:producto].nil?
				session[:id_producto] = 0
			else		
				session[:id_producto] = params[:producto][:id].to_i
			end
		else
			session[:id_producto] = 0
		end
	end

	def id_version
		if request.post?
			if params[:version].nil?		
				session[:id_version] = 0				
			else
				session[:id_version] = params[:version][:id].to_i
			end
		else 
			session[:id_version] = 0
		end
	end

	def resultado_vacio?
		@error = ""
		if @resultado.size == 0
			@error = "No hay suficientes datos para computar esta métrica."
		end
	end

	def elegir_producto
		@error = "Elija un producto para computar esta métrica."
	end

	def elegir_version
		@error = "Elija una versión de un producto para computar esta métrica."
	end

	def incidentesPorProducto
	end

	def incidentesPorProductoReport
		@title = "Incidentes por Producto"
		incidentes = Incidente.find(:all)
		@resultado = Hash.new()
		incidentes.each do |itemIncidente|
				@resultado[itemIncidente.version.producto.to_s()] ||= 0
				@resultado[itemIncidente.version.producto.to_s()] += 1	
		end
		self.resultado_vacio?
	end

	def incidentesPorVersion
		id_producto
	end

	def incidentesPorVersionReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			@title = Producto.find(session[:id_producto]).nombre
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
					if itemIncidente.version.producto.id == session[:id_producto]
						@resultado[itemIncidente.version.to_s()] ||= 0
						@resultado[itemIncidente.version.to_s()] += 1	
					end
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def incidentesPorSeveridad
	end

	def incidentesPorSeveridadReport
		@title = "Incidentes por Severidad"
		incidentes = Incidente.find(:all)
		@resultado = Hash.new()
		incidentes.each do |itemIncidente|
				@resultado[itemIncidente.severidad] ||= 0
				@resultado[itemIncidente.severidad] += 1	
		end
		self.resultado_vacio?
	end

	def	incidentesPorSeveridadProducto
			id_producto
	end

	def	incidentesPorSeveridadProductoReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			@title = Producto.find(session[:id_producto]).nombre
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
					if itemIncidente.version.producto.id == session[:id_producto]
						@resultado[itemIncidente.severidad] ||= 0
						@resultado[itemIncidente.severidad] += 1	
					end
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def incidentesPorSeveridadVersion
			id_version
	end

	def incidentesPorSeveridadVersionReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_version] != 0
			@title = Version.find(session[:id_version]).to_s
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
					if itemIncidente.version.id == session[:id_version]
						@resultado[itemIncidente.severidad] ||= 0
						@resultado[itemIncidente.severidad] += 1	
					end
			end
			self.resultado_vacio?
		else
			self.elegir_version
		end
	end

	def incidentesPorTipo
	end

	def incidentesPorTipoReport
		@title = "Incidentes por Tipo"
		incidentes = Incidente.find(:all)
		@resultado = Hash.new()
		incidentes.each do |itemIncidente|
				@resultado[itemIncidente.tipo_incidente] ||= 0
				@resultado[itemIncidente.tipo_incidente] += 1	
		end
		self.resultado_vacio?
	end

	def incidentesPorTipoProducto
			id_producto
	end

	def incidentesPorTipoProductoReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			@title = Producto.find(session[:id_producto]).nombre
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
					if itemIncidente.version.producto.id == session[:id_producto]
						@resultado[itemIncidente.tipo_incidente] ||= 0
						@resultado[itemIncidente.tipo_incidente] += 1	
					end
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def incidentesPorTipoVersion
		id_version
	end

	def incidentesPorTipoVersionReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_version] != 0
			@title = Version.find(session[:id_version]).to_s
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
					if itemIncidente.version.id == session[:id_version]
						@resultado[itemIncidente.tipo_incidente] ||= 0
						@resultado[itemIncidente.tipo_incidente] += 1	
					end
			end
			self.resultado_vacio?
		else
			self.elegir_version
		end
	end

	def incidentesPorEstado
	end

	def incidentesPorEstadoReport
		@title = "Incidentes por Estado"
		incidentes = Incidente.find(:all)
		@resultado = Hash.new()
		incidentes.each do |itemIncidente|
				@resultado[itemIncidente.estado] ||= 0
				@resultado[itemIncidente.estado] += 1	
		end
		self.resultado_vacio?
	end

	def incidentesPorEstadoProducto
			id_producto
	end

	def incidentesPorEstadoProductoReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			@title = Producto.find(session[:id_producto]).nombre
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
					if itemIncidente.version.producto.id == session[:id_producto]
						@resultado[itemIncidente.estado] ||= 0
						@resultado[itemIncidente.estado] += 1	
					end
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def incidentesPorEstadoVersion
			id_version
	end

	def incidentesPorEstadoVersionReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_version] != 0
			@title = Version.find(session[:id_version]).to_s
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
					if itemIncidente.version.id == session[:id_version]
						@resultado[itemIncidente.estado] ||= 0
						@resultado[itemIncidente.estado] += 1	
					end
			end
			self.resultado_vacio?
		else
			self.elegir_version
		end
	end

	def tdceProducto
		id_producto
	end

	def tdceProductoReport
		@title = ""
		@metrica = "TDCE"
		@resultado = Hash.new()
		if session[:id_producto] != 0
			temp = Hash.new()			
			@title = Producto.find(session[:id_producto]).nombre
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
					if itemIncidente.version.producto.id == session[:id_producto]
						if itemIncidente.version.fecha_fin_real != nil
							temp[itemIncidente.version.numero] ||= Hash.new
							temp[itemIncidente.version.numero][:antes] ||= 0
							temp[itemIncidente.version.numero][:despues] ||= 0
							if itemIncidente.fecha_apertura < itemIncidente.version.fecha_fin_real
									temp[itemIncidente.version.numero][:antes] += 1
							else
								temp[itemIncidente.version.numero][:despues] += 1
							end
						end
					end
			end
			for clave in temp.keys do
				@resultado[clave] = 	temp[clave][:antes].to_f/((temp[clave][:antes]+temp[clave][:despues]).to_f)
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def seaProducto
		id_producto
	end

	def seaProductoReport
		@title = ""
		@metrica = "SEA"
		@resultado = Hash.new()
		if session[:id_producto] != 0
			@title = Producto.find(session[:id_producto]).nombre
			versiones = Version.find(:all,:conditions => ["producto_id = ? and fecha_fin_real is not null", session[:id_producto]])
			versiones.each do |itemVersion|
						duracion_real = itemVersion.fecha_fin_real - itemVersion.fecha_inicio + 1
						duracion_estimada = itemVersion.fecha_fin_estimada - itemVersion.fecha_inicio + 1
						if duracion_estimada != 0
							@resultado[itemVersion.numero] = duracion_real.to_f / duracion_estimada.to_f
						end
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def eeaProducto
		id_producto
	end

	def eeaProductoReport
		@title = ""
		@metrica = "EEA"
		@resultado = Hash.new()
		if session[:id_producto] != 0
			@title = Producto.find(session[:id_producto]).nombre
			versiones = Version.find(:all,:conditions => ["producto_id = ? and fecha_fin_real is not null", session[:id_producto]])
			versiones.each do |itemVersion|
				if itemVersion.hs_hombre_estimadas != 0
					@resultado[itemVersion.numero] = itemVersion.hs_hombre_reales.to_f / itemVersion.hs_hombre_estimadas.to_f
				end
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
		
	end

	def productividad
		id_producto
	end

	def productividadReport
		@title = ""
		@metrica = "Productividad [KLOC / HH reales]"
		@resultado = Hash.new()
		if session[:id_producto] != 0
			@title = Producto.find(session[:id_producto]).nombre
			versiones = Version.find(:all,:conditions => ["producto_id = ? and fecha_fin_real is not null",
													session[:id_producto]])
			versiones.each do |itemVersion|
				if itemVersion.hs_hombre_reales != 0
					@resultado[itemVersion.numero] = (itemVersion.KLOC).to_f/(itemVersion.hs_hombre_reales).to_f
				end
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def promedioDeVidaDeIncidentesNoCerrados
		id_producto
	end

	def promedioDeVidaDeIncidentesNoCerradosReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			temp = Hash.new()	
			@title = Producto.find(session[:id_producto]).nombre
			@unidad ='[días]'
			incidentes = Incidente.find(:all,:conditions => ["estado != 'Cerrado'"])
			incidentes.each do |itemIncidente|
				if itemIncidente.version.producto.id == session[:id_producto]
					temp[itemIncidente.version.to_s] ||= Hash.new()
					temp[itemIncidente.version.to_s][:dias] ||= 0
					temp[itemIncidente.version.to_s][:cantidad] ||= 0
					temp[itemIncidente.version.to_s][:dias] += ((Date.today - itemIncidente.fecha_apertura) + 1)
					temp[itemIncidente.version.to_s][:cantidad] += 1
				end
			end
			for clave in temp.keys do
				@resultado[clave] = temp[clave][:dias].to_f / temp[clave][:cantidad].to_f
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def promedioTiempoCorreccionDesdeDeteccion
		id_producto
	end

	def promedioTiempoCorreccionDesdeDeteccionReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			temp = Hash.new()	
			@title = Producto.find(session[:id_producto]).nombre
			@unidad ='[días]'
			incidentes = Incidente.find(:all,:conditions => ["estado = 'Cerrado'"])
			incidentes.each do |itemIncidente|
				if itemIncidente.version.producto.id == session[:id_producto]
					temp[itemIncidente.version.to_s] ||= Hash.new()
					temp[itemIncidente.version.to_s][:dias] ||= 0
					temp[itemIncidente.version.to_s][:cantidad] ||= 0
					temp[itemIncidente.version.to_s][:dias] += ((itemIncidente.fecha_cierre - itemIncidente.fecha_apertura) + 1)
					temp[itemIncidente.version.to_s][:cantidad] += 1
				end
			end
			for clave in temp.keys do
				@resultado[clave] = temp[clave][:dias].to_f / temp[clave][:cantidad].to_f
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def promedioTiempoCorreccionDesdeAsignacion
		id_producto
	end

	def promedioTiempoCorreccionDesdeAsignacionReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			temp = Hash.new()	
			@title = Producto.find(session[:id_producto]).nombre
			@unidad ='[días]'
			incidentes = Incidente.find(:all,:conditions => ["estado = 'Cerrado'"])
			incidentes.each do |itemIncidente|
				if itemIncidente.version.producto.id == session[:id_producto]
					temp[itemIncidente.version.to_s] ||= Hash.new()
					temp[itemIncidente.version.to_s][:dias] ||= 0
					temp[itemIncidente.version.to_s][:cantidad] ||= 0
					temp[itemIncidente.version.to_s][:dias] += ((itemIncidente.fecha_cierre - itemIncidente.fecha_asignacion) + 1)
					temp[itemIncidente.version.to_s][:cantidad] += 1
				end
			end
			for clave in temp.keys do
				@resultado[clave] = temp[clave][:dias].to_f / temp[clave][:cantidad].to_f
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def frecuenciaDeIncidentes
		id_producto
	end

	def frecuenciaDeIncidentesReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			temp = Hash.new()	
			@title = Producto.find(session[:id_producto]).nombre
			@unidad ='[KLOC / incidente]'
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
				if itemIncidente.version.producto.id == session[:id_producto]
					temp[itemIncidente.version.to_s] ||= Hash.new()
					temp[itemIncidente.version.to_s][:cantidad] ||= 0
					temp[itemIncidente.version.to_s][:cantidad] += 1
					temp[itemIncidente.version.to_s][:kloc] ||= itemIncidente.version.KLOC
				end
			end
			for clave in temp.keys do
				@resultado[clave] = temp[clave][:kloc].to_f / temp[clave][:cantidad].to_f
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def costOfFixingProblems
		id_producto
	end

	def costOfFixingProblemsReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			temp = Hash.new()	
			@title = Producto.find(session[:id_producto]).nombre
			@unidad ='[HH / incidente]'
			incidentes = Incidente.find(:all,:conditions => ["estado = 'Cerrado'"])
			incidentes.each do |itemIncidente|
				if itemIncidente.version.producto.id == session[:id_producto]
					temp[itemIncidente.version.numero] ||= Hash.new()
					temp[itemIncidente.version.numero][:horas] ||= 0
					temp[itemIncidente.version.numero][:horas] += itemIncidente.costo
					temp[itemIncidente.version.numero][:cantidad] ||= 0
					temp[itemIncidente.version.numero][:cantidad] += 1
				end
			end
			for clave in temp.keys do
				@resultado[clave] = temp[clave][:horas].to_f / temp[clave][:cantidad].to_f
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

	def convergenciaDeIncidentes
			id_producto
	end

	def convergenciaDeIncidentesReport
		@title = ""
		@resultado = Hash.new()
		if session[:id_producto] != 0
			@title = Producto.find(session[:id_producto]).nombre
			incidentes = Incidente.find(:all)
			incidentes.each do |itemIncidente|
					if itemIncidente.version.producto.id == session[:id_producto]
						@resultado[itemIncidente.version.to_s] ||= Hash.new()
						@resultado[itemIncidente.version.to_s][:cerrados] ||= 0
						@resultado[itemIncidente.version.to_s][:nocerrados] ||= 0	
						if itemIncidente.estado == 'Cerrado'	
							@resultado[itemIncidente.version.to_s][:cerrados] += 1
						else
							@resultado[itemIncidente.version.to_s][:nocerrados] += 1
						end
					end
			end
			self.resultado_vacio?
		else
			self.elegir_producto
		end
	end

end

